package br.ufrgs.engsoft.servlet;

import java.io.IOException;
import java.util.HashMap;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.ufrgs.engsoft.ui.Controller;
import br.ufrgs.engsoft.util.AcaoEnum;
import br.ufrgs.engsoft.util.HtmlParameterEnum;
import br.ufrgs.engsoft.util.HtmlUtil;

/**
 * Servlet principal da aplicacao.
 */
@WebServlet("/paginas/*")
public class PublicacaoServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// Encaminha tratamento para o metodo doPost()
    	this.doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String codigoHtml = null;
		
		try { // Definicao de variaveis
			AcaoEnum acaoUsuario = null;
			HashMap<HtmlParameterEnum, Object> parametrosHtml = null;
			
	    	// Obtem o parametro de Request "acao"
			String parametroRequest = request.getParameter("acao");

			// Obtendo o Enum correspondente a acao
			acaoUsuario = AcaoEnum.valueOfByAcao(parametroRequest);
			
			// Obtem o controlador referente a acao solicitada pelo usuario
			Controller controlador = acaoUsuario.getControllerFactory();
			
	    	// Tratamento da requisicao HTTP pelo controlador 
			// (retorna valores a serem substituidos por parametros no HTML)
			parametrosHtml = controlador.processaAcao(request);
			
			// Obtem o codigo HTML referente a acao solicitada pelo usuario
			codigoHtml = HtmlUtil.getCodigoHtmlDaAcao(acaoUsuario);
			
			// Substituindo parametros do HTML pelos valores gerados pelo controlador
			codigoHtml = HtmlUtil.replaceParameters(codigoHtml, parametrosHtml);
		} catch (Exception e) {
			e.printStackTrace();
			
			// Caso algum excecao seja lancada apresentar tela de erro padrao
			codigoHtml = HtmlUtil.getCodigoHtmlDaAcao(AcaoEnum.ERROR);
			codigoHtml = HtmlUtil.replaceParameter(codigoHtml, HtmlParameterEnum.MENSAGEM_ERRO, e);
		} finally {
			// Imprime no objeto de resposta HTTP o codigo HTML gerado pela aplicacao
			response.getOutputStream().print(codigoHtml);
		}
	}
}